/**
 * 1、开发模式，调用Mock入口：vue.config.js devServer.after
 * 2、生产模式，调用Mock入口：/src/main.js
 */
import Mock from '../public/static/js/mock';
import registers from './registers';

// const params2Object = function(url) {
//   const search = url.split('?')[1];
//   if (!search) {
//     return {};
//   }
//   return JSON.parse(
//     '{"' + 
//       decodeURIComponent(search)
//         .replace(/"/g, '\\"')
//         .replace(/&/g, '","')
//         .replace(/=/g, '":"')
//         .replace(/\+/g, ' ') +
//     '"}'
//   );
// }

/**
 * 模拟响应数据，用于导出开发环境mock api响应模拟
 * @param {*} url 
 * @param {*} type 
 * @param {*} respond 
 * @returns 
 */
const responseFake = (url, type, respond) => {
  return {
    url: new RegExp(`${url}`),
    type: type,
    response(req, res) {
      res.json(Mock.mock(respond instanceof Function ? respond(req, res) : respond));
    }
  }
}

/**
 * 前端Mock模拟，请谨慎使用，它将重新定义XMLHttpRequest对象，导致许多第三方库失效（如进度时间，下载等）
 * mockXHR 未使用
 */
// export function mockXHR() {
//   // 修复在使用 MockJS 情况下，设置 withCredentials = true ,且未被拦截的跨域请求丢失 Cookies 的问题
//   Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send;
//   Mock.XHR.prototype.send = function() {
//     if (this.custom.xhr) {
//       this.custom.xhr.withCredentials = this.withCredentials || false;
//       if (this.responseType) {
//         this.custom.xhr.responseType = this.responseType;
//       }
//     }
//     this.proxy_send(...arguments);
//   };
//   // 规整响应（普通对象、函数返回(可以接收axios的传参到参数e中)）
//   function XHR2ExpressReqWarp(respond) {
//     return function(options) {
//       let result = null;
//       if (respond instanceof Function) {
//         const {type, url} = options;
//         let {body} = options;
//         // 先按JSON字符串来转对象
//         // 若出错，则按URL来转对象，若还是出错，则传递原参数值
//         try {
//           body = JSON.parse(body);
//         } catch (e) {
//           try {
//             body = params2Object('?' + body);
//           } catch (err) {
//             window.console.error('Mocks XHR2ExpressReqWarp request data fromat error.');
//             return;
//           }
//         }
//         result = respond({
//           method: type,
//           body,
//           query: params2Object(url)
//         });
//       } else {
//         result = respond;
//       }
//       return Mock.mock(result);
//     }
//   }
//   // 循环注册 mock api
//   for (const i of registers) {
//     Mock.mock(new RegExp(i.url), i.type || 'get', XHR2ExpressReqWarp(i.response));
//   }
// }

// 开发环境Mock api自动注册(通过express注册)
export default registers.map(route => {
  let type = route.type || 'get';
  type = `${type}`.toLowerCase();
  return responseFake(route.url, type, route.response);
});
